package ge.util;

import ge.escola.Disciplina;



import java.util.ArrayList;

import java.util.Date;

public class Horario {
	private double horaI;
	private double horaF;
	private double duracaoAula;
	private String dia;
	private Disciplina disciplina;
	private Validadores validador = new Validadores();
	private String horaIString;
	private String dataInicial;
	private String dataFinal;
	/**
	 * Cria o objeto horario
	 * @param dia
	 * String que representa o dia
	 * @param horaI
	 * String que representa a hora inicial de um intervalo (Ex: 08:00)
	 *  
	 * @param duracaoAula
	 * Double que representa a duracao das aulas
	 * @param disciplina
	 * Objeto disciplina
	 * @throws Exception
	 */
	public Horario(String dia, String horaI, double duracaoAula,Disciplina disciplina) throws Exception{
		if(!validador.validaHora(horaI)){
			throw new Exception("A hora deve ser no formato hh:mm");
		}
		this.horaIString = horaI;
		this.duracaoAula = duracaoAula;
		this.horaI = converteHoraI(horaI);
		this.horaF = this.horaI + duracaoAula;
		this.disciplina = disciplina;
		
		dia = dia.toLowerCase();
		if(dia.equals(Dias.SEGUNDA.getDia()) || dia.equals(Dias.TERCA.getDia()) || dia.equals(Dias.QUARTA.getDia())
				|| dia.equals(Dias.QUINTA.getDia()) || dia.equals(Dias.SEXTA.getDia()) || dia.equals(Dias.SABADO.getDia()) || dia.equals(Dias.DOMINGO.getDia())){
			this.dia = dia;
		}else{
			throw new Exception("Dia invalido");
		}
	}
	
	/**
	 * 
	 * @return retorna a hora inicial convertida minutos e horas em um double, representando as horas
	 */
	public double getHoraI(){
		return horaI;
	}
	/**
	 * 
	 * @return Return a hora final do intervalo
	 */
	public double getHoraF(){
		return horaF;
	}
	/**
	 * 
	 * @return a duracao das aulas convertida em um double
	 */
	public double getDuracaoAula(){
		return duracaoAula;
	}
	/**
	 * Seta a hora inicial
	 * @param horaI
	 * Nova hora inicial do intervalo
	 * @throws Exception
	 * Se nao for uma string no formato hh:mm e no maximo 23:59
	 */
	public void setHoraI(String horaI) throws Exception{
		if(!validador.validaHora(horaI)){
			throw new Exception("A hora deve ser no formato hh:mm");
		}
		this.horaI = converteHoraI(horaI);
		this.horaF = this.horaI + this.duracaoAula;
	}
	/**
	 * 
	 * @return retorna o dia em que o horario esta setado
	 */
	public String getDia(){
		return dia;
	}
	/**
	 * Muda o dia
	 * @param dia
	 * String que representa o dia
	 * @throws Exception
	 */
	public void setDia(String dia) throws Exception{
		dia = dia.toLowerCase();
		if(dia.equals(Dias.SEGUNDA.getDia()) || dia.equals(Dias.TERCA.getDia()) || dia.equals(Dias.QUARTA.getDia())
				|| dia.equals(Dias.QUINTA.getDia()) || dia.equals(Dias.SEXTA.getDia()) || dia.equals(Dias.SABADO.getDia())){
			this.dia = dia;
		}else{
			throw new Exception("Dia invalido");
		}
		
	}
	/**
	 * 
	 * @return a disciplina
	 */
	public Disciplina getDisciplina() {
		return disciplina;
	}
	/**
	 * Muda a disciplina do horario
	 * @param disciplina
	 * Objeto do tipo disciplina
	 */
	public void setDisciplina(Disciplina disciplina) {
		this.disciplina = disciplina;
	}
	
	public boolean equals(Object objeto){
		if(!(objeto instanceof Horario)){
			return false;
		}
		Horario hora1 = (Horario) objeto;
		if(this.horaI == hora1.getHoraI() && this.horaF == hora1.getHoraF() && this.dia.equals(hora1.getDia())){
			return true;
		}
		return false;
	}
	
	public String toString(){
		String DisciplinaNome;
		int numeroSala;
		
		String horaI = (int)this.horaI +":";
		if(this.horaI <= 9.0){
			horaI = "0" + horaI;
		}
		
		String horaI2 = String.valueOf((int)(this.horaI - (int)this.horaI)*60);
		
		if(horaI2.equals("0")){
			horaI = horaI + horaI2 + "0";

		}else{
			horaI = horaI + horaI2;
			
		}
		
		String horaF = (int)this.horaF +":";
		if(this.horaF <= 9.0){
			horaF = "0" + horaF;
		}
		String horaF2 = String.valueOf((int)(this.horaF - (int)this.horaF)*60);
		if(horaF2.equals("0")){
			horaF = horaF + horaF2 + "0";
		}else{
			horaF = horaF + horaF2;
		}
		try {
			DisciplinaNome = disciplina.getNome();
		} catch (Exception e) {
			DisciplinaNome = "nao cadastrada";
		}
		try {
			numeroSala = disciplina.getSala();
		} catch (Exception e) {
			numeroSala = 0;
		}
		String toString = String.format("%s - %s as %s | Disciplina: %s | Sala: %s\n", dia,horaI,horaF,DisciplinaNome ,numeroSala);
		return toString;
	}
		
	private double converteHoraI(String horaI){
		String[] hora = horaI.split(":");
		double convertido = Double.valueOf(hora[0]) + (Double.valueOf(hora[1])/60);
		return convertido;
	}
	public String getHoraIEmString(){
		return horaIString;
	}
	
}